#!/bin/bash

# 工作目录，以斜线结尾
work_dir=$1
# 启动程序名称
program=$2
# 是否支持数据库更新操作
enable_migrate=$3

mysql_version="5.7.23"

if [[ $MYSQL_VERSION ]]; then
    mysql_version=$MYSQL_VERSION
fi

has_conf_file=0
conf_file="${work_dir}appsettings.json"

if [[ $REMOTE_CONF_FILE ]]; then
    echo "已传入远程配置文件：${REMOTE_CONF_FILE}"
    remote_conf_file_cache="${work_dir}.remote_conf_file"

    use_remote=0
    if [ -f $conf_file ]; then
        if [ -f $remote_conf_file_cache ]; then
            echo "本地配置文件已存在"
            diff $remote_conf_file_cache $conf_file > /dev/null
            if [ $? == 0 ]; then 
                echo "本地配置文件是上次启动时获取的远程配置文件，清除缓存，准备重新获取"
                use_remote=1
            else
                echo "本地配置文件是重新配置的配置文件"
            fi
        fi
    else
        echo "本地配置文件不存在"
        use_remote=1
    fi

    if [ $use_remote == 1 ]; then
        rm -f $remote_conf_file_cache
        rm -f $conf_file
        wget -q $REMOTE_CONF_FILE -O $remote_conf_file_cache
        if [ $? == 0 ]; then
            cp $remote_conf_file_cache $conf_file
            echo "已应用远程配置文件"
            has_conf_file=1
        else
            echo "远程配置文件下载失败"
            rm -f $remote_conf_file_cache
            use_remote=0
        fi
    fi

    if [ $use_remote == 0 ]; then
        if [ -f $conf_file ]; then
            echo "已应用本地配置文件"
            has_conf_file=1
        else
            echo "没有可用的配置文件，程序尝试使用预定义配置运行"
        fi
    fi
fi

# 简单清除配置文件中的注释（JSON规范中不允许在JSON中添加注释），如果是/**/的注释不会被清除，在值或者键中出现的//将被清除，上述两种情况都将导致文档解析失败
conf_file_content=$(sed "s/\/\/[^\"']*$//g" $conf_file)

if [ $has_conf_file == 1 ]; then
    has_nlog=$(echo $conf_file_content | jq 'has("NLog")')

    if [[ $? == 0 ]] && [[ $has_nlog == 'true' ]]; then
        echo "检测到NLog配置"
        is_async=$(echo $conf_file_content | jq -r '.NLog.targets.async')

        if [ $is_async == "true" ]; then
            echo "已开启异步日志输出"
        else
            echo "警告：未开启异步日志输出，日志输出性能将大幅降低，影响系统整体性能！"
        fi

        has_elasticsearch=$(echo $conf_file_content | jq -r '.NLog.targets|to_entries[]|select((.value|type)=="object" and .value.type=="ElasticSearch")|.key')
        if [[ $? == 0 ]] && [[ $has_elasticsearch ]]; then
            echo "检测到ELK日志输出配置"
            has_not_elasticsearch=$(echo $conf_file_content | jq -r '.NLog.targets|to_entries[]|select((.value|type)=="object" and .value.type!="ElasticSearch")|.key')
            if [[ $? == 0 ]] && [[ $has_not_elasticsearch ]]; then
                echo "检测到非ELK日志输出配置，在容器内运行的程序不允许输出本地（包括控制台、文件）日志，已放弃启动程序"
                exit 1
            fi
        else
            echo "未检测到ELK日志输出配置，在容器内运行的程序不允许输出本地（包括控制台、文件）日志，已放弃启动程序"
            exit 1
        fi
    else
        echo "未检测到NLog配置，程序可能将没有日志输出"
    fi
fi

if [[ $enable_migrate ]] && [[ $ENABLE_MIGRATE ]]; then
    echo "尝试启动数据库迁移，请确保已进行数据库备份"
    version=$(<$work_dir.version)
    echo "当前程序版本：$version"
    if [[ $ENABLE_MIGRATE == $version ]]; then
        echo "使用数据库迁移参数启动程序，请注意观察日志输出，在数据库迁移完成后重启容器"
        echo "y" | $work_dir$program --urls=http://*:5000 --migrate --mysql-version=$mysql_version
        exit $?
    else
        echo "提供的版本号不正确，请重新输入以确保是人为操作"
        exit 0
    fi
fi

echo '启动程序'
$work_dir$program --urls=http://*:5000
exit $?